package org.ecloud.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.ecloud.common.constants.StringPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期格式工具类。<br>
 * (可以参考{@link DateFormatUtils }的方法)
 * 
 */
public class DateFormatUtil {
	
	private DateFormatUtil(){}
	
	/**
	 * yyyy-MM-dd 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_DATE = new SimpleDateFormat(
			StringPool.DATE_FORMAT_DATE);
	
	/**
	 * yyyy-MM-dd HH:mm:ss 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_DATETIME = new SimpleDateFormat(
			StringPool.DATE_FORMAT_DATETIME);
	
	/**
	 * yyyy-MM-dd HH:mm 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_DATETIME_NOSECOND = new SimpleDateFormat(
			StringPool.DATE_FORMAT_DATETIME_NOSECOND);

	/**
	 * yyyy-MM-dd HH 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_DATETIME_NOMINUTE = new SimpleDateFormat(
			StringPool.DATE_FORMAT_DATETIME_NOMINUTE);
	
	/**
	 * HH:mm:ss 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_TIME = new SimpleDateFormat(
			StringPool.DATE_FORMAT_TIME);
	
	/**
	 * HH:mm 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_TIME_NOSECOND = new SimpleDateFormat(
			StringPool.DATE_FORMAT_TIME_NOSECOND);
	
	/**
	 * yyyy-MM-dd HH:mm:ss.SSS 时间格式
	 */
	protected static final DateFormat DATE_FORMAT_TIMESTAMP = new SimpleDateFormat(
			StringPool.DATE_FORMAT_TIMESTAMP);
	
	protected static final DateFormat DATE_FORMAT_SHORT_DATE = new SimpleDateFormat(
			StringPool.DATE_FORMAT_SHORT_DATE);
	
	protected static final DateFormat DATE_FORMAT_SHORT_MONTH = new SimpleDateFormat(
			StringPool.DATE_FORMAT_SHORT_MONTH);
	
	protected static final DateFormat DATE_FORMAT_MONTH = new SimpleDateFormat(
			StringPool.DATE_FORMAT_MONTH);	
	
	protected static final DateFormat DATE_FORMAT_YEAR = new SimpleDateFormat(
			StringPool.DATE_FORMAT_YEAR);		

	protected static Logger logger = LoggerFactory.getLogger(DateFormatUtil.class);
	
	/**
	 * 根据日期字符串是否含有时间决定转换为日期还是日期时间还是时间
	 * 
	 * @param dateString
	 *            时间字符串
	 * @return 格式化的时间
	 * @throws ParseException
	 */
	public static Date parse(String dateString) {
		if(dateString == null)
			return null;
		
		String[] styles = new String[]{
				StringPool.DATE_FORMAT_YEAR,
				StringPool.DATE_FORMAT_DATE,
				StringPool.DATE_FORMAT_DATETIME,
				StringPool.DATE_FORMAT_DATETIME_NOMINUTE,
				StringPool.DATE_FORMAT_DATETIME_NOSECOND,
				StringPool.DATE_FORMAT_MONTH,
				StringPool.DATE_FORMAT_TIME,
				StringPool.DATE_FORMAT_TIME_NOSECOND,
				StringPool.DATE_FORMAT_TIMESTAMP};
		
		return parse(dateString, styles);
	}

	/**
	 * 按指定的格式输出string到date
	 * 
	 * @param dateString
	 *            时间字符串
	 * @param style
	 *            格式化参数 （请使用{@link StringPool}的变量）
	 * @return 格式化的时间
	 * @throws ParseException
	 */
	public static Date parse(String dateString, String style)
			throws ParseException {
		DateFormat dateFormat = new SimpleDateFormat(style);
		return dateFormat.parse(dateString);
	}
	/**
	 * 按格式输出date到string,按照日期类型自动判断
	 * 
	 * @param date
	 *            按格式输出
	 * @return 时间字符串
	 */
	public static String format(Object date) {
		if (date instanceof java.sql.Timestamp) {
			return DATE_FORMAT_TIMESTAMP.format(date);
		} else if (date instanceof java.sql.Time) {
			return DATE_FORMAT_TIME.format(date);
		} else if (date instanceof java.sql.Date) {
			return DATE_FORMAT_DATE.format(date);
		}
		return DATE_FORMAT_DATETIME.format(date);
	}
	/**
	 * 将日期字符串转成日期对象，该字符串支持的格式是传入的格式数组
	 * 
	 * @param dateString
	 *            日期字符串
	 * @param style
	 *            日期格式数组（请使用{@link StringPool}的变量）
	 * @return
	 */
	public static Date parse(String dateString, String... style) {
		Date date = null;
		if (StringUtil.isEmpty(dateString))
			return date;
		try {
			date = DateUtils.parseDate(dateString, style);
		} catch (Exception e) {
			logger.error("Parse the date(" + dateString + ") occur errors:"
					+ e.getMessage());
		}
		return date;
	}

	/**
	 * 格式化输出date到string
	 * 
	 * @param date
	 *            时间
	 * @param style
	 *            格式化参数
	 * @return
	 */
	public static String format(Date date, String style) {
		DateFormat dateFormat = new SimpleDateFormat(style);
		return dateFormat.format(date);
	}

	/**
	 * 将string(yyyy-MM-dd)转化为日期
	 * 
	 * @param dateString
	 * @return
	 * @throws ParseException
	 */
	public static Date parseDate(String dateString) throws ParseException {
		return DATE_FORMAT_DATE.parse(dateString);
	}

	/**
	 * 按格式(yyyy-MM-dd)输出date到string
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDate(Date date) {
		return DATE_FORMAT_DATE.format(date);
	}

	/**
	 * 将string(yyyy-MM-dd HH:mm:ss)转化为日期
	 * 
	 * @param dateString
	 * @return
	 * @throws ParseException
	 */
	public static Date parseDateTime(String dateString) throws ParseException {
		return DATE_FORMAT_DATETIME.parse(dateString);
	}

	/**
	 * 按格式(yyyy-MM-dd HH:mm:ss )输出date到string
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDatetTime(Date date) {
		return DATE_FORMAT_DATETIME.format(date);
	}

	/**
	 * 按格式(yyyy-MM-dd HH:mm )输出date到string
	 * 
	 * @param date
	 * @return
	 */
	public static String formatTimeNoSecond(Date date) {
		return DATE_FORMAT_DATETIME_NOSECOND.format(date);
	}

	/**
	 * 按格式(yyyy-MM-dd HH:mm )输出 string到date
	 * 
	 * @param dateString
	 * @return
	 * @throws ParseException
	 */
	public static Date parseTimeNoSecond(String dateString)
			throws ParseException {
		return DATE_FORMAT_DATETIME_NOSECOND.parse(dateString);
	}

	/**
	 * 根据长整型毫秒数返回时间形式。<br>
	 * 日期格式为yyyy-MM-dd HH:mm:ss，例:2007-01-23 13:45:21
	 * 
	 * @param millisecond
	 *            毫秒数
	 * @return 时间形式字符串
	 */
	public static String format(long millisecond) {
		Date date = new Date(millisecond);
		return format(date, StringPool.DATE_FORMAT_DATETIME);
	}

	/**
	 * 根据长整型毫秒数和指定的时间格式返回时间字符串。
	 * 
	 * @param millisecond
	 *            毫秒数
	 * @param style
	 *            指定格式
	 * @return
	 */
	public static String format(long millisecond, String style) {
		Date date = new Date(millisecond);
		return format(date, style);
	}

	/**
	 * 取当前系统日期，并按默认格式返回
	 * 
	 * @return
	 */
	public static String getCurrentTime() {
		return getCurrentTime(null);
	}

	public static String getNowYMD(){
		return DATE_FORMAT_SHORT_DATE.format(new java.util.Date());
	}
	
	public static String getNowYM(){
		return DATE_FORMAT_SHORT_MONTH.format(new java.util.Date());
	}	
	
	public static String getNowY(){
		return DATE_FORMAT_YEAR.format(new java.util.Date());
	}	
	public static String getNowPart(String format){
		DateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(new java.util.Date());
	}
	
	/**
	 * 取当前系统日期，并按指定格式或者是默认格式返回
	 * 
	 * @param style
	 * @return
	 */
	public static String getCurrentTime(String style) {
		if (StringUtil.isEmpty(style))
			style = StringPool.DATE_FORMAT_DATETIME;
		return format(new Date(), style);
	}
}
